7-2 PRGig

在上節中,我們介紹了 LWP::Simple 的用法和範例。使用 LWP::Simple 來抓取網頁相當方便,但是它也有一些缺點:
  1. 在抓取網頁過程中,無法傳會狀態碼(Status Code)。常見的狀態碼有下列幾種:

    狀態碼說明
    200OK,一切正常
    404找不到所要求的網頁
    408等待伺服器回覆時間過久
    500伺服器內部發生錯誤

  2. Perl 程式並不會在表頭(Header)向伺服器表明自己的身份。
  3. 不支援代理伺服器(Proxy Server)。
因此,若要能夠取得要求網頁的狀態碼,就必須要使用較複雜的模組。以下的這個例子,可以先判斷是否抓取網頁成功,若成功,則印出網頁原始碼;若不成功,則印出錯誤訊息。程式碼(tstatus.pl)如下:

原始檔(tstatus.pl):(灰色區域按兩下即可拷貝)
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;

$ua = new LWP::UserAgent;				# 產生 UserAgent 物件
$request = new HTTP::Request('GET', $ARGV[0]);	# 產生 Request 物件
$response = $ua->request($request);			# 開始抓取網頁,並將結果傳會 $response
if ($response->is_success) {			# 若抓取網頁成功,則印出 HTML 原始碼
	print $response->content;
} else {						# 若抓取網頁不成功,則印出錯誤訊息
	print $response->error_as_HTML;
}

下面這個範例(tproxy.pl),則使用了 HTTP 代理伺服器來減少網路的流量:

原始檔(tproxy.pl):(灰色區域按兩下即可拷貝)
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;

$ua = new LWP::UserAgent;				# 產生 UserAgent 物件
$ua->proxy('http', 'http://proxy.nthu.edu.tw/proxy.pac');	# 設定 HTTP 的代理伺服器
$ua->no_proxy('nthu.edu.tw');			# 在清大的網頁(nthu.edu.tw)不使用代理伺服器
$request = new HTTP::Request('GET', $ARGV[0]);	# 產生 Request 物件
$response = $ua->request($request);			# 開始抓取網頁,並將結果傳會 $response
if ($response->is_success) {			# 若抓取網頁成功,則印出 HTML 原始碼
	print $response->content;
} else {						# 若抓取網頁不成功,則印出錯誤訊息
	print $response->error_as_HTML;
}

行文至此,讀者應該可以感受到用 Perl 來抓取網頁的便利性與彈性。稍微修改上述的範例程式,就可以產生許多不同的應用,以下是一些有用(或有趣)的應用範例:


Perl